package ru.megazlo.basemvc.config;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.authentication.encoding.Md5PasswordEncoder;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.core.userdetails.UserDetailsService;

@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(securedEnabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter {

	@Autowired
	private UserDetailsService userDetailsService;

	// регистрируем нашу реализацию UserDetailsService а также PasswordEncoder для приведения пароля в формат SHA1
	@Autowired
	public void registerGlobalAuthentication(AuthenticationManagerBuilder auth) throws Exception {
		auth.userDetailsService(userDetailsService).passwordEncoder(getMdPasswordEncoder());
	}

	private Md5PasswordEncoder getMdPasswordEncoder() {
		Md5PasswordEncoder rez = new Md5PasswordEncoder();
		rez.setIterations(2);
		return rez;
	}

	@Override
	protected void configure(HttpSecurity http) throws Exception {
		// включаем защиту от CSRF атак
		http.csrf().disable()
				.authorizeRequests()// указываем правила запросов по которым будет определятся доступ к ресурсам и остальным данным
				.antMatchers("/resources/**", "/**").permitAll()
				.anyRequest().permitAll().and();

		http.formLogin()
				.loginPage("/error/denied")// указываем страницу с формой логина
				.loginProcessingUrl("/j_spring_security_check")// указываем action с формы логина
				.failureUrl("/account/logIn/false") // указываем URL при неудачном логине
				.usernameParameter("j_username")// Указываем параметры логина и пароля с формы логина
				.passwordParameter("j_password")
				.permitAll();// даем доступ к форме логина всем

		http.logout().permitAll()// разрешаем делать выход всем :D
				.logoutUrl("/account/logOut")// указываем URL логаута
				.logoutSuccessUrl("/")// указываем URL при удачном логауте
				.invalidateHttpSession(true);// делаем не валидной текущую сессию
	}

	/*
	    <http auto-config="true" use-expressions="true" access-denied-page="/error/denied">
        <!--<intercept-url pattern="/*" access="permitAll"/>-->
        <intercept-url pattern="/account/viewProfile" access="isAuthenticated()"/>
        <!--<intercept-url pattern="/krams/main/admin" access="hasRole('ROLE_ADMIN')"/>
        <intercept-url pattern="/krams/main/common" access="hasRole('ROLE_USER')"/>-->
        <form-login login-page="/error/denied" authentication-failure-url="/account/logIn/false" default-target-url="/account/logIn/true"/>
        <logout invalidate-session="true" logout-success-url="/" logout-url="/account/logOut"/>
        <anonymous username="guest" granted-authority="ROLE_ANONYMOUS"/>
    </http>
	 */
}
